 | | PROGRAMACIÓN DECLARATIVA |
“Di qué quieres, pero no cómo lo quieres” (la frase que describe la programación declarativa)
“El mundo real no es declarativo. Tiene estado (las entidades tienen una memoria interna) y concurrencia (las entidades evolucionan independientemente” (Peter Van Roy & Seif Haridi)
Programación declarativa vs. Programación imperativa
La programación declarativa (también llamada “programación descriptiva”) se suele contraponer a la programación imperativa:
- En la programación imperativa se especifica de forma detallada “cómo” se realiza un proceso para alcanzar un resultado.
- En la programación declarativa se especifica “qué” se quiere obtener. Para ello hay que describir primeramente el conocimiento que se tiene de un determinado problema o campo: el conocimiento específico (los hechos) y el conocimiento genérico (funciones, reglas, restricciones, etc.). A partir de ese conocimiento se pueden plantear varias consultas o problemas al sistema para obtener los resultados correspondientes. Estos resultados se obtienen mediante mecanismos de inferencia o cálculos automáticos, sin necesidad de especificar ningún tipo de proceso ni flujo de control.
Tipos de lenguajes declarativos
De la misma manera que hay muchos lenguajes imperativos, también hay muchos lenguajes de tipo declarativo. De todas formas, la frontera entre los lenguajes imperativos y declarativos es difusa. Un lenguaje imperativo puede incluir recursos declarativos como funciones y reglas. Y un lenguaje declarativo puede incluir recursos imperativos. Es difícil encontrar lenguajes declarativos “puros”.
Los lenguajes declarativos están asociados a uno o varios paradigmas de programación. Por ejemplo:
- Lógicos: Prolog, F-Prolog (programación lógica difusa), Gödel.
- Funcionales: Haskell.
- Acceso a las bases de datos relacionales: SQL.
- Consulta de colecciones de datos XML: Xquery.
- Funcionales y lógicos: Curry, Escher, ML.
- Funcionales e imperativos: Lisp, Scheme, OcamL, Erlang.
- Presentación de páginas web: HTML.
- Estructuras de datos: XML.
Características de la programación declarativa
- Independencia de estado.
Una expresión declarativa conserva la semántica, independientemente del estado del sistema en ejecución. Y cuando la expresión declarativa es parametrizada y se invoca con los mismos argumentos, devuelve siempre el mismo resultado.
- Transparencia referencial.
Una expresión declarativa tiene transparencia referencial. Es decir, la expresión puede ser sustituida por su valor sin que cambie el significado del programa.
- Ubicuidad.
El orden de las expresiones declarativas no afecta al significado del programa.
- Idempotencia.
La replicación de expresiones declarativas no produce ningún efecto.
Ventajas de la programación declarativa
La programación declarativa presenta varias ventajas frente a la programación imperativa:
- Flexibilidad y generalidad.
La programación declarativa es flexible. Está orientado a resolver un conjunto de problemas asociados a la base de conocimientos especificados. En cambio, la programación imperativa está orientada a resolver un solo problema.
- Semántica superior.
El nivel semántico de la programación declarativa es superior al de la programación imperativa, pues para codificar el conocimiento genérico utiliza expresiones genéricas. En cambio, la programación imperativa utiliza básicamente expresiones de detalle.
Esta semántica superior se traduce en mayor claridad, sencillez y expresividad que en la programación imperativa, que suele ser bastante críptica en general. También simplifica el desarrollo de programas, incluidos los de tipo concurrente.
MENTAL y la Programación Declarativa
MENTAL es un lenguaje multiparadigma. Los diversos paradigmas se pueden expresar mediante los mismos recursos lingüísticos. Algunos paradigmas (como el paradigma lógico) son esencialmente declarativos, pero en todos los paradigmas se pueden utilizar expresiones declarativas, que pueden ser de tipo imperativo, lógico, funcional, algebraico, etc.
La programación declarativa no es realmente un paradigma de programación, sino un meta-paradigma o un estilo de programación que puede utilizarse en todos los paradigmas de programación.
Se suele afirmar que existe una frontera difusa entre la programación imperativa y la declarativa. Con MENTAL, este tema se aclara: no hay tal frontera (horizontal), sino una relación diádica (vertical) entre la programación declarativa y todos los paradigmas de programación, incluyendo el paradigma imperativo.
En MENTAL las expresiones declarativas son de varios tipos:
- Expresiones genéricas. Producen inferencias o cálculos automáticos. Gracias a las expresiones genéricas se pueden especificar numerosos paradigmas de programación: programación lógica, orientada a eventos, a restricciones, a aspectos, a agentes, etc.
- Sustituciones diferidas (representaciones).
- Expresiones de sustitución en las que se establecen relaciones de todo tipo: lógico, algebraico, etc.
Ejemplos de expresiones declarativas
〈( f(x y) = (x+y x*y) )〉 // función
f(3 4) // ev. (7 12)
〈( m>5 → m=5 )〉 // regla
(m = 12) // ev. (m = 5)
( v =: a+b+c ) // representación
(a=1 b=2 c=3)
v // ev. 6
a∈C // relación de pertenencia a un conjunto C no definido previamente
(x = 0)
(a∈C → (x = 123)
x // ev. 123
A⊂B // relación de inclusión de un conjunto en otro, ambos no definidos previamente
(x = 0)
(A⊂B → (x = 123))
x // ev. 123
(a*b = c) // relación algebraica entre variables no definidas previamente
(x = 0)
((a*b = c) → (x = 123))
x // ev. 123
(ε^2 = 0) // definición de infinitésimo (expresión imaginaria)
(a+ε)^2 // ev. (a^2 + 2aε)
(i^2 = -1) // definición de la unidad imaginaria (expresión imaginaria)
(a+i)^2 // ev. (a^2 + 2ai - 1)
i^3 // ev. −i
Bibliografía
- Agustí, Jaume (ed.). Segundo Congreso de Programación Declarativa (ProDe’93, Blanes). Consejo Superior de Investigaciones Científicas, 1993.
- Cantone, Domenico; Omodeo, Eugenio. Set Theory for Computing: From Decision Procedures to Declarative Programming with Sets. Springer, 2001.
- Carpio Cañada, José; Aranda Corral, Gonzalo Antonio; Marco de la Rosa, José. Programación declarativa. Servicio de Publicaciones - Universidad de Huelva, 2011.
- Delgado Kloos, Carlos. Programación declarativa. Fundación Rogelio Segovia para el Desarrollo de las Telecomunicaciones, 1994.
- Flach, Peter. Simply Logical: Intelligent Reasoning by Example. John Wiley and Sons, 1994. Disponible online.
- Lloyd, J.W. Declarative programming in Escher. University of Bristol, 1995.
- Lloyd, J.W. Practical advantages of declarative programming. In Joint Conference on Declarative Programming, GULP-PRODE'94, 1994.
- Padawitz, Peter. Deductive and Declarative Programming. Cambridge University Press, 1992.
- Scott, Michael L. Programming Language Pragmatics. Morgan Kaufmann, 2005.
- Van Roy, Peter; Haridi, Seif. Concepts, Techniques, and Models of Computer Programming. MIT Press, 2004.